 /*******************************************************************************
  * Copyright (c) 2000, 2005 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.update.internal.core;
 import java.io.*;
 import java.net.*;

 import org.eclipse.core.runtime.*;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.update.core.*;

 /**
  * Plugin Content Consumer on a Site
  * for a plugin that will run from a jar
  */
 public class SiteFilePackedPluginContentConsumer extends ContentConsumer {

     private IPluginEntry pluginEntry;
     private ISite site;
     private boolean closed = false;
     private String jarPath;
     private String tempPath;

     /*
      * Constructor
      */
     public SiteFilePackedPluginContentConsumer(IPluginEntry pluginEntry, ISite site) {
         this.pluginEntry = pluginEntry;
         this.site = site;
     }

     /*
      * @see ISiteContentConsumer#store(ContentReference, IProgressMonitor)
      */
     public void store(ContentReference contentReference, IProgressMonitor monitor) throws CoreException {
         InputStream inStream = null;

         if (closed) {
             UpdateCore.warn("Attempt to store in a closed SiteFilePluginContentConsumer", new Exception ()); //$NON-NLS-1$
 return;
         }

         try {
             URL newURL = new URL(site.getURL(), Site.DEFAULT_PLUGIN_PATH + pluginEntry.getVersionedIdentifier().toString() + ".jar"); //$NON-NLS-1$
 inStream = contentReference.getInputStream();
             jarPath = newURL.getFile().replace(File.separatorChar, '/');
             File jarFile = new File(jarPath);
             if (jarFile.exists()) {
                 throw Utilities.newCoreException(NLS.bind(Messages.UpdateManagerUtils_FileAlreadyExists, (new Object [] { jarFile })), null);
             }
             // error recovery
 tempPath= ErrorRecoveryLog.getLocalRandomIdentifier(jarPath+".tmp"); //$NON-NLS-1$
 ErrorRecoveryLog.getLog().appendPath(ErrorRecoveryLog.BUNDLE_JAR_ENTRY, tempPath);
             //
 UpdateManagerUtils.copyToLocal(inStream, tempPath, null);
         } catch (IOException e) {
             throw Utilities.newCoreException(NLS.bind(Messages.GlobalConsumer_ErrorCreatingFile, (new String [] { tempPath })), e);
         } finally {
             if (inStream != null) {
                 try {
                     // close stream
 inStream.close();
                 } catch (IOException e) {
                 }
             }
         }
     }

     /*
      * @see ISiteContentConsumer#close()
      */
     public void close() throws CoreException {

         if (closed) {
             UpdateCore.warn("Attempt to close a closed SiteFilePluginContentConsumer", new Exception ()); //$NON-NLS-1$
 return;
         }

         if (tempPath != null) {
             // rename file
 ErrorRecoveryLog.getLog().appendPath(ErrorRecoveryLog.RENAME_ENTRY, tempPath);
             File fileToRename = new File(tempPath);
             boolean sucess = false;
             if (fileToRename.exists()) {
                 File renamedFile = new File(jarPath);
                 sucess = fileToRename.renameTo(renamedFile);
             }
             if (!sucess) {
                 String msg = NLS.bind(Messages.ContentConsumer_UnableToRename, (new String [] { tempPath, jarPath }));
                 throw Utilities.newCoreException(msg, new Exception (msg));
             }
         }

         if (site instanceof SiteFile)
              ((SiteFile) site).addPluginEntry(pluginEntry);
         closed = true;
     }

     /*
      *
      */
     public void abort() throws CoreException {

         if (closed) {
             UpdateCore.warn("Attempt to abort a closed SiteFilePluginContentConsumer", new Exception ()); //$NON-NLS-1$
 return;
         }

         boolean sucess = true;

         // delete plugin.jar
 if (jarPath != null) {
             ErrorRecoveryLog.getLog().appendPath(ErrorRecoveryLog.DELETE_ENTRY, jarPath);
             File fileToRemove = new File(jarPath);

             if (fileToRemove.exists()) {
                 sucess = fileToRemove.delete();
             }
         }

         if (!sucess) {
             String msg = NLS.bind(Messages.SiteFilePackedPluginContentConsumer_unableToDelete, (new String [] { jarPath }));
             UpdateCore.log(msg, null);
         }
         closed = true;
     }

 }

